const lineNumbers = require("line-numbers");
const {JSDOM} = require("jsdom");
const {parseLineNumberAndText, addLineNumbers, groupResult, writeResultsToCSV} = require("./utils");
const fs = require("node:fs");
const {ClientEventClickAttributes} = require("./enums");
const createCsvWriter = require('csv-writer').createObjectCsvWriter;

function lookIterateWrite(filePath) {
    const fileName = filePath.split('/')[filePath.split('/').length - 1]
    let htmlContent;
    try {
        htmlContent = fs.readFileSync(filePath, 'utf-8');
    } catch (err) {
        console.error(`${filePath} не читается:`, err);
        process.exit(1); // Выход из скрипта при ошибке чтения файла
    }

// добавим номера строк
    const lines = lineNumbers(htmlContent, {});
    const exLines = lines.split('\n').map(it => parseLineNumberAndText(it));

// Парсинг HTML-контента
    const dom = new JSDOM(htmlContent);
    const document = dom.window.document;

//ну еще кроме лайн намбера функция в принципе дербанит всю инфу из тег компонентов

    const dataArray = addLineNumbers(document, exLines);

    const newDataObj = groupResult(dataArray);

//итерируемся по группам дублей
    Object.keys(newDataObj).forEach((key, index) => {
// мапаем дату по колонкам
        const csvData = newDataObj[key].sort((a, b) => a.ID.localeCompare(b.ID)).map(row => {
            return {
                lineNumber: row.lineNumber,
                ID: row.ID,
                TitleInDOM: row.TitleInDOM,
                bind: row.bind,
                Entity: row.Entity,
                haveDuple: row.haveDuple,
                ...ClientEventClickAttributes.reduce((acc, value) => {
                    if (row[value]) {
                        acc[value] = row[value]
                    }
                    return acc
                }, {})
            };
        });
        const headerObj = [
            {id: 'lineNumber', title: 'Line Number'},
            {id: 'ID', title: 'ID'},
            {id: 'TitleInDOM', title: 'TitleInDOM'},
            {id: 'event', title: 'Event'},
            {id: 'bind', title: 'Bind'},
            {id: 'Entity', title: 'Entity'},
            {id: 'haveDuple', title: 'Have Duplicate'},
            ...ClientEventClickAttributes.map(it => ({id: it, title: 'Event ' + it}))
        ];
        writeResultsToCSV(csvData, headerObj, `${fileName}_${index + 1}`)

    })
    return dataArray.map(it => it.ID)
}

module.exports = {lookIterateWrite}